package br.com.obardavez.util;

import java.util.Collection;
import java.util.List;

import br.com.obardavez.util.impl.CollectionUtilImpl;

import com.google.inject.ImplementedBy;

@ImplementedBy(CollectionUtilImpl.class)
public interface CollectionUtil {

	/**
	 * Concatena todos os textos armazenados na coleção utilizando o delimitador
	 * padräo
	 * 
	 * @param texts
	 *            Coleção de textos
	 * @return String contendo todos os textos separados pelo deimitador padrão
	 */
	String join(Collection<?> texts);

	/**
	 * Concatena todos os textos armazenados na coleção utilizando o delimitador
	 * informado
	 * 
	 * @param texts
	 *            Coleção de objetos
	 * @param delimiter
	 *            Delimitador utilizado para concatenar os textos
	 * @return String contendo todos os textos separados pelo deimitador
	 */
	String join(Collection<?> texts, String delimiter);

	/**
	 * Concatena todos os textos armazenados no array utilizando o delimitador
	 * padrao
	 * 
	 * @param texts
	 *            Array de textos
	 * @return String contendo todos os textos separados pelo deimitador padrão
	 */
	String join(String[] texts);

	/**
	 * Concatena todos os textos armazenados no array utilizando o delimitador
	 * informado
	 * 
	 * @param texts
	 *            Array de textos
	 * @param delimiter
	 *            Delimitador utilizado para concatenar os textos
	 * @return String contendo todos os textos separados pelo deimitador
	 */
	String join(String[] texts, String delimiter);

	/**
	 * Verifica se o array informado é nulo ou vazio
	 * 
	 * @param array
	 *            Array que sera verificado
	 * @return Boolean que indica se o array é nulo ou vazio
	 */
	Boolean isEmpty(Object[] array);

	/**
	 * Verifica se o array informado nao é nulo nem vazio
	 * 
	 * @param array
	 *            Array que sera verificado
	 * @return Boolean que indica se o array nao é nulo nem vazio
	 */
	Boolean isNotEmpty(Object[] array);

	/**
	 * Verifica se a collection informada é nula ou vazia
	 * 
	 * @param items
	 *            Colecao de itens que sera verificada
	 * @return Boolean que indica se a colecao é nula ou vazia
	 */
	Boolean isEmpty(Collection<?> items);

	/**
	 * Verifica se a collection informada nao é nula nem vazia
	 * 
	 * @param items
	 *            Colecao de itens que sera verificada
	 * @return Boolean que indica se a colecao nao é nula nem vazia
	 */
	Boolean isNotEmpty(Collection<?> items);

	<T> List<T> asList(Collection<T> items);

	<T> List<T> asList(T[] items);

	Util getUtil();

    <E> String joinIdEntity(Collection<E> collection) ;

    <E> String joinIdEntity(Collection<E> collection, String delimiter);
}